package com.zb.jsp.dao.advertDao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zb.jsp.common.HibernateSessionFactory;
import com.zb.jsp.pojo.advert.TblAdvert;
import com.zb.jsp.utils.PropertiesCopyUtil;
import com.zb.jsp.utils.StringUtil;
import com.zb.jsp.vo.advert.AdvertVo;

public class TblAdvertDao {

	Session session = null;
	Transaction transaction = null;

	/**
	 * 将pojo对象中的广告信息保存到数据库中
	 * 
	 * @param tblAdvert
	 *            广告信息的pojo对象
	 */
	public void addTblAdvert(TblAdvert tblAdvert) {
		try {
			// 获取一个 Session
			session = HibernateSessionFactory.getSession();
			// step 2 : 打开一个事务
			transaction = session.beginTransaction();
			// step 3 :调用 session接口进行查询操作
			session.save(tblAdvert);
			// step 4 : 提交事务
			transaction.commit();
		} catch (Exception e) {
			// step 异常：事务回滚
			if (transaction != null) {
				transaction.rollback();
			}
			e.printStackTrace();
		} finally {
			// step 5 : 关闭session
			HibernateSessionFactory.closeSession();
		}

	}

	/**
	 * 根据广告类型或广告名查询广告信息列表
	 * 
	 * @param advertVoQry
	 *            广告名或广告类型
	 * @return advertVoList查询的广告信息
	 */
	public List<AdvertVo> findAdvertVoListByAdvertVoQry(AdvertVo advertVoQry) {

		List<AdvertVo> advertVoList = null;
		try {
			// 获取一个 Session
			session = HibernateSessionFactory.getSession();
			String hql = "select new com.zb.jsp.vo.advert.AdvertVo(ta.id,ta.advertName,ta.notes,tdf.value,taa.advertName,ta.advertPath) from TblAdvert ta,TblAdvertAddress taa,TblDefType tdf where ta.advertAddressId=taa.id and ta.advertType=tdf.code ";
			// 判断页面上是否输入了广告位名的查询条件
			if (!StringUtil.isNullOrEmpty(advertVoQry.getAdvertName())) {
				hql = hql + " and ta.advertName like '%"
						+ advertVoQry.getAdvertName() + "%'";
			}
			hql = hql + " and ta.advertType = '" + advertVoQry.getAdvertType()
					+ "'";

			// 获得一个查询的query
			Query hqlQuery = session.createQuery(hql);

			// 计算从第几条记录开始取数据(（【当前是第几页】-1）*【每一页显示多少条记录】)
			int firstRow = (advertVoQry.getCurPage() - 1)
					* advertVoQry.getNumPerPage();

			// 游标从这个点位开始取数据
			hqlQuery.setFirstResult(firstRow);
			// 每页取多少数据 10条
			hqlQuery.setMaxResults(advertVoQry.getNumPerPage());

			// 执行查询动作
			advertVoList = hqlQuery.list();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭session
			HibernateSessionFactory.closeSession();
		}
		return advertVoList;
	}
	
	public int findAdvertVoCountByAdvertVoQry(AdvertVo advertVoQry) {

		int advertVoCount = 0;
		try {
			// 获取一个 Session
			session = HibernateSessionFactory.getSession();
			String hql = "select count(*) from TblAdvert ta,TblAdvertAddress taa,TblDefType tdf where ta.advertAddressId=taa.id and ta.advertType=tdf.code ";
			// 判断页面上是否输入了广告位名的查询条件
			if (!StringUtil.isNullOrEmpty(advertVoQry.getAdvertName())) {
				hql = hql + " and ta.advertName like '%"
						+ advertVoQry.getAdvertName() + "%'";
			}
			hql = hql + " and ta.advertType = '" + advertVoQry.getAdvertType()
					+ "'";

			// 获得一个查询的query
			Query hqlQuery = session.createQuery(hql);

			// 执行查询动作
			List advertVoList = hqlQuery.list();
			advertVoCount = ((Long)advertVoList.get(0)).intValue();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭session
			HibernateSessionFactory.closeSession();
		}
		return advertVoCount;
	}

	/**
	 * 根据页面获取到的id号删除数据库信息
	 * 
	 * @param ids
	 *            拼接好 的id 号
	 */
	public void delAdvert(String ids) {

		try {
			// 获取一个 Session连接
			session = HibernateSessionFactory.getSession();

			// 打开一个事务
			transaction = session.beginTransaction();

			// ids为要删除的信息的id的拼接
			String hql = "delete from TblAdvert where id in (" + ids
					+ ")";

			// 调用 session接口进行删除操作
			Query hqlQuery = session.createQuery(hql);

			hqlQuery.executeUpdate();

			// 提交事务
			transaction.commit();
		} catch (Exception e) {
			if (transaction != null) {
				// 事务回滚
				transaction.rollback();
			}
			e.printStackTrace();
		} finally {
			// 关闭session
			HibernateSessionFactory.closeSession();
		}
	}

	/**	
	 * 根据id查询数据库信息
	 * @param id 传入的id号
	 * @return 返回给 TblAdvert 对象
	 */
	public TblAdvert findTblAdvertById(int id) {
		// 用来存放查询结果的pojo对象
		TblAdvert tblAdvert = null;

		try {
			// step 1 : 获取一个 Session连接
			Session session = HibernateSessionFactory.getSession();

			// step 2 :调用 session接口进行根据主键查询操作
			tblAdvert = (TblAdvert) session.get(
					TblAdvert.class, id);
		} finally {
			// step 3 : 关闭session
			HibernateSessionFactory.closeSession();
		}

		return tblAdvert;

	}
	
	/**
	   * 更新广告数据到tbl_advert
	   * 
	   * @param tblAdvert
	   *          广告信息
	   */
	  public void uptTblAdvert(AdvertVo advertVo) {
	    Session session = null;
	    Transaction tc = null;
	    try {
	      // step 1 : 获取一个 Session连接
	      session = HibernateSessionFactory.getSession();

	      // step 2 : 打开一个事务
	      tc = session.beginTransaction();
	      
	      // 取得数据库里原来的数据
	      TblAdvert tblAdvertDb = (TblAdvert) session.get(
	          TblAdvert.class, advertVo.getId());
	      // 保存文件上传路径
	      String advertPath = tblAdvertDb.getAdvertPath();
	      //将vo中 的信息复制到pojo中去
	      PropertiesCopyUtil.copy(tblAdvertDb, advertVo);

	      // 假如页面上输入的默认文件路径为空
	      if (StringUtil.isNullOrEmpty(tblAdvertDb.getAdvertPath())) {
	        // 把原来的文件路径设置到更新对象中
	        tblAdvertDb.setAdvertPath(advertPath);
	      }

	      // step 3 :调用 session接口进行增加操作
	      session.update(tblAdvertDb);

	      // step 4 : 提交事务
	      tc.commit();
	    } catch (Exception e) {
	      if (tc != null) {
	        // other:事务回滚
	        tc.rollback();
	      }
	      e.printStackTrace();
	    } finally {
	      // step 5 : 关闭session
	      HibernateSessionFactory.closeSession();
	      System.out.println("广告信息修改成功");
	    }
	  }
}
